package br.gov.dataprev.treinamento.ejb.util;

import java.util.HashSet;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;

import br.gov.dataprev.treinamento.ejb.excecao.ExcecaoValidacao;

public class ValidacaoUtil {
	
	private static final ValidacaoUtil instance = new ValidacaoUtil();
	
	private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
	
	private ValidacaoUtil() {
		super();
	}
	
	public static ValidacaoUtil getInstance() {
		return instance;
	}
	
	public <T> boolean isValid(T obj, Class<?> ... grupos) {
		
		Set<ConstraintViolation<T>> violacoes = validator.validate(obj, grupos);
		
		if (violacoes!= null && violacoes.size() > 0) {
			return false;
		}
		
		return true;
		
	}
	
	public <T> Set<ConstraintViolation<T>> obterViolacoes(T obj, Class<?> ... grupos) {
		
		return validator.validate(obj, grupos);
		
	}
	
	public <T> void validar(T obj, Class<?> ... grupos) throws ExcecaoValidacao {
		
		Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
		Set<ConstraintViolation<T>> violacoes = validator.validate(obj, grupos);
		
		if(violacoes != null && violacoes.size() > 0) {
			Set<ConstraintViolation<?>> violacoes2 = new HashSet<ConstraintViolation<?>>(violacoes);
			throw new ExcecaoValidacao(obterString(violacoes2));
		}
		
	}
	
	public String obterString(Set<ConstraintViolation<?>> violacoes) {
		
		StringBuffer sb = new StringBuffer();
		
		for (ConstraintViolation<?> violacao : violacoes) {
			sb.append(violacao.getMessage());
			sb.append(" : ");
			sb.append(violacao.getPropertyPath().toString());
			sb.append(" : ");
			sb.append(violacao.getInvalidValue());
			sb.append("\n");
		}
		
		return sb.toString();
		
	}

}
